package com.hotel.management.mapper;

import com.hotel.management.entity.Employee;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 员工数据访问层接口
 * 
 * @author Hotel Management Team
 * @version 1.0.0
 * @since 2024-06-28
 */
@Mapper
public interface EmployeeMapper {

    /**
     * 插入员工信息
     * 
     * @param employee 员工实体
     * @return 影响的行数
     */
    int insert(Employee employee);

    /**
     * 根据ID查询员工信息
     * 
     * @param id 员工ID
     * @return 员工实体，如果不存在则返回null
     */
    Employee selectById(@Param("id") Long id);

    /**
     * 查询所有员工信息
     * 
     * @return 员工列表
     */
    List<Employee> selectAll();

    /**
     * 根据ID更新员工信息
     * 
     * @param employee 员工实体（必须包含ID）
     * @return 影响的行数
     */
    int updateById(Employee employee);

    /**
     * 根据ID删除员工信息（物理删除）
     * 
     * @param id 员工ID
     * @return 影响的行数
     */
    int deleteById(@Param("id") Long id);

    /**
     * 根据姓名查询员工信息（模糊查询）
     * 
     * @param name 员工姓名
     * @return 员工列表
     */
    List<Employee> selectByName(@Param("name") String name);

    /**
     * 根据姓名精确查询员工信息
     * 
     * @param name 员工姓名
     * @return 员工实体，如果不存在则返回null
     */
    Employee selectByNameExact(@Param("name") String name);

    /**
     * 根据职位查询员工信息
     * 
     * @param position 职位名称
     * @return 员工列表
     */
    List<Employee> selectByPosition(@Param("position") String position);

    /**
     * 根据状态查询员工信息
     * 
     * @param status 员工状态
     * @return 员工列表
     */
    List<Employee> selectByStatus(@Param("status") String status);

    /**
     * 根据角色ID查询员工信息
     * 
     * @param roleId 角色ID
     * @return 员工列表
     */
    List<Employee> selectByRoleId(@Param("roleId") Long roleId);

    /**
     * 根据手机号查询员工信息
     * 
     * @param phone 手机号
     * @return 员工实体，如果不存在则返回null
     */
    Employee selectByPhone(@Param("phone") String phone);

    /**
     * 根据邮箱查询员工信息
     * 
     * @param email 邮箱地址
     * @return 员工实体，如果不存在则返回null
     */
    Employee selectByEmail(@Param("email") String email);

    /**
     * 分页查询员工信息
     * 
     * @param offset 偏移量
     * @param limit 每页数量
     * @return 员工列表
     */
    List<Employee> selectByPage(@Param("offset") int offset, @Param("limit") int limit);

    /**
     * 根据条件分页查询员工信息
     * 
     * @param name 员工姓名（可选，模糊查询）
     * @param position 职位（可选）
     * @param status 状态（可选）
     * @param offset 偏移量
     * @param limit 每页数量
     * @return 员工列表
     */
    List<Employee> selectByConditionWithPage(@Param("name") String name,
                                           @Param("position") String position,
                                           @Param("status") String status,
                                           @Param("offset") int offset,
                                           @Param("limit") int limit);

    /**
     * 统计员工总数
     * 
     * @return 员工总数
     */
    int countAll();

    /**
     * 根据条件统计员工数量
     * 
     * @param name 员工姓名（可选，模糊查询）
     * @param position 职位（可选）
     * @param status 状态（可选）
     * @return 符合条件的员工数量
     */
    int countByCondition(@Param("name") String name,
                        @Param("position") String position,
                        @Param("status") String status);

    /**
     * 批量插入员工信息
     * 
     * @param employees 员工列表
     * @return 影响的行数
     */
    int batchInsert(@Param("employees") List<Employee> employees);

    /**
     * 根据ID列表批量删除员工信息
     * 
     * @param ids 员工ID列表
     * @return 影响的行数
     */
    int batchDeleteByIds(@Param("ids") List<Long> ids);

    /**
     * 更新员工状态
     * 
     * @param id 员工ID
     * @param status 新状态
     * @return 影响的行数
     */
    int updateStatus(@Param("id") Long id, @Param("status") String status);
}
